<?php

Yii::import('user.models.DSUserIdentity');

class SNUserIdentity extends CUserIdentity
{
    protected $serviceName, $userInfo;

    public function __construct($userName=false,$password=false)
    {
        if($userName) $this->username=$userName;
        if($password) $this->password=$password;
    }

    public function SNLogin()
    {
        $userIdentity=new DSUserIdentity();
        $this->serviceName=Yii::app()->request->getQuery('service');

        if($this->userInfo=$this->userInfo=$this->getUserInfoFromPostRequest()){
            if(Yii::app()->request->getQuery('redirectUrl')) $this->close();
            else $this->checkPostRequest();
        }elseif($service=Yii::app()->snauth->getService($this->serviceName)){
            unset(Yii::app()->session['emailExist']);
            if($service->login()) $this->userInfo=$service->getUserInfo();
        }

        if($this->userInfo){
            if($this->userInfo['user']['email'] && !Yii::app()->session['noLogin'])
                $this->username=$userIdentity->username=$this->userInfo['user']['email'];
            else
                $this->username=$userIdentity->username=$this->userInfo['user']['userName'];

            unset(Yii::app()->session['noLogin']);

            if(!$user=$userIdentity->getUserModel()){
                if(!Yii::app()->session['emailExist']){
                    $this->isAlreadyRegisteredName();
                    $this->confirmYourEmail();
                }
                if(!$user=$this->login()) return false;
            }
            return $userIdentity->login($user);
        }
        return false;
    }

    public function close()
    {
        unset(Yii::app()->session['emailExist'],Yii::app()->session['noLogin']);
        Yii::app()->end('<script>window.close();window.opener.location.reload();</script>');
    }

    protected function isAlreadyRegisteredName()
    {
        if(Profile::model()->findByAttributes(array(
            'firstName'=>$this->userInfo['profile']['firstName'],
            'lastName'=>$this->userInfo['profile']['lastName'],
        ))){
            $buttons=(object)array(
                (object)array(
                    'name'=>'isAlreadyRegistered-no',
                    'value'=>'Нет, это не я',
                ),
                (object)array(
                    'name'=>'isAlreadyRegistered-yes',
                    'value'=>'Да, это я',
                ),
            );

            Yii::app()->controller->render('ext.snauth.views._isAlreadyRegistered',array(
                'title'=>'Найдено соответствие',
                'message'=>'На нашем сайте зарегистрирован пользователь <br />'.$this->userInfo['profile']['firstName'].' '.$this->userInfo['profile']['lastName'].'.<br />Может быть, это Вы?',
                'buttons'=>$buttons,
                'userInfo'=>json_encode($this->userInfo),
            ));
            Yii::app()->end();
        }
    }

    protected function isAlreadyRegisteredEmail()
    {
        if($profile=User::model()->findByAttributes(array(
            'email'=>$this->userInfo['user']['email'],
        ))){
            $buttons=(object)array(
                (object)array(
                    'name'=>'isAlreadyRegistered-no',
                    'value'=>'Нет, это не я',
                ),
                (object)array(
                    'name'=>'isAlreadyRegistered-yes',
                    'value'=>'Да, это я',
                ),
            );
            if(Yii::app()->session['emailExist']){
                if(Yii::app()->session['emailExist']<2){
                    $buttons=(object)array(
                        (object)array(
                            'name'=>'isAlreadyRegistered-no',
                            'value'=>'Ок',
                        ),
                    );
                    Yii::app()->session['emailExist']+=1;
                    $message='Пользователь с такой электронной почтой уже существует, укажите Ваш почтовый адрес!';
                }else{
                    $buttons=(object)array(
                        (object)array(
                            'name'=>'yes_im_robot',
                            'value'=>'Ок',
                        ),
                    );

                    $message='Судя по поведению, Вы либо робот, либо злоумышленник. Почему бы Вам не попытать счастья на другом сайте?';
                }
            }else{
                Yii::app()->session['emailExist']=1;
                $message='На нашем сайте зарегистрирован пользователь c почтой<br />'.$this->userInfo['user']['email'].'.<br />Может быть, это Вы?';
            }

            Yii::app()->controller->render('ext.snauth.views._isAlreadyRegistered',array(
                'title'=>'Найдено соответствие',
                'message'=>$message,
                'buttons'=>$buttons,
                'userInfo'=>json_encode($this->userInfo),
            ));
            Yii::app()->end();
        }
    }

    protected function confirmYourEmail()
    {
        if(!Yii::app()->session['emailExist']) Yii::app()->session['emailExist']=1;
        Yii::app()->controller->render('ext.snauth.views._confirmEmail',array(
            'message'=>!$this->userInfo['user']['email'] ? 'Укажите Ваш e-mail' : 'Подтвердите Ваш e-mail',
            'email'=>$this->userInfo['user']['email'],
            'model'=>new User(),
            'userInfo'=>json_encode($this->userInfo),
        ));

        Yii::app()->end();
    }

    protected function login()
    {
        $user=new User();
        $profile=new Profile();
        $statistics=new UserStatistics();

        $user->attributes=$this->userInfo['user'];
        $profile->attributes=$this->userInfo['profile'];

        try{
            $transaction=Yii::app()->db->beginTransaction();

            if(!$user->password){
                $user->password=$user->getRandomString();
                //$user->sendPassword($user->password);
            }

            if($user->isActive=$this->userInfo['user']['isActive']){
                $user->role=1;
                $user->isConfirmed=1;
                $user->confirmCode=null;
            }else{
                $user->confirmCode=$user->getConfirmCodeString();
                $user->sendConfirmCode();
            }
            $user->save(false);

            $profile->userId=$user->id;
            $profile->save(false);
            $statistics->userId=$user->id;
            $statistics->save(false);
            $transaction->commit();

            return $user;
        }catch(Exception $e){
            $transaction->rollback();
            Yii::app()->user->setFlash('userMessage','Неудачная попытка! Попробуйте ещё раз.<br />'.$e);
        }

        return false;
    }

    protected function checkPostRequest()
    {
        if(!$this->userInfo) $this->close();

        if(isset($_POST['User'])){
            $this->userInfo['user']['email']=$_POST['User']['email'];
            $this->isAlreadyRegisteredEmail();
        }

        if(isset($_POST['isAlreadyRegistered-yes'])){
            Yii::app()->user->setFlash('userMessage','Привет, '.$this->userInfo['profile']['firstName'].'!<br />
                    Войдите в свой аккаунт, как Вы заходили раньше');
            $this->close();
        }

        if(isset($_POST['isAlreadyRegistered-no'])){
            Yii::app()->session['noLogin']=1;
            $this->confirmYourEmail();
        }

        if(isset($_POST['yes_im_robot'])){
            Yii::app()->user->setFlash('userMessage','Попытка аутентификации не удалась');
            $this->close();
        }
    }

    private function getUserInfoFromPostRequest(){
        $result=array();

        if(isset($_POST['User']['userInfo'])){
            foreach(json_decode($_POST['User']['userInfo']) as $name=>$value){
                $result[$name]=(array)$value;
            }
        }elseif(isset($_POST['userInfo'])){
            foreach(json_decode($_POST['userInfo']) as $name=>$value){
                $result[$name]=(array)$value;
            }
        }
        return $result;
    }
}